home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / ippon / source.lzh / FuncEnemy / searchz2.c < prev    next >
C/C++ Source or Header  |  2000-07-07  |  4KB  |  200 lines

  1. /* searchz2.c 自機をサーチするザコ */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../main.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../psearch.h"
  10. #include "../sound.h"
  11.  
  12.  
  13. #define PALET_MAIN    0x0600
  14.  
  15. #define wabs(x) ((x) >= 0 ? (short) (x) : (short) -(x))
  16. #define abs(x)  ((x) >= 0 ? (int) (x) : (int) -(x))
  17.  
  18. enum {
  19.     TO_LEFT, TO_CENTER, TO_RIGHT
  20. };
  21.  
  22.  
  23. /* 関数プロトタイプ宣言 */
  24. static short EnemyMoveSearchZ2 (ENEMY *);
  25. static void EnemyFreeSearchZ2 (ENEMY *);
  26.  
  27.  
  28. /* 初期化ルーチン */
  29. void EnemyAllocSearchZ2 (ENEMY * p)
  30. {
  31.     signed short x = SHORT_LX;
  32.  
  33.     /* このザコに関してはX座標は中心からの距離で */
  34.     /* 常にプレイヤーの反対側に現れる */
  35.     if (player->x < 144) {
  36.         p->lx = (player->x + x) * 65536;
  37.         p->vx = 16384;
  38.     } else {
  39.         p->lx = (player->x - x) * 65536;
  40.         p->vx = -16384;
  41.     }
  42.     p->vy = 4 * 65536;
  43.  
  44.     p->angle = 64;
  45.     p->pt = obj_searchz + ((p->angle) >> 3);
  46.     p->info = PALET_MAIN | PRIORITY_ZAKO;
  47.     p->hit_sx = 12;
  48.     p->hit_sy = 12;
  49.     p->hp = 1;        /* 耐久力 */
  50.     p->damage = 0;
  51.     p->damage_mode = DAMAGE_THROUGH;
  52.  
  53.     p->func_enemy_move = EnemyMoveSearchZ2;
  54.     p->func_enemy_free = EnemyFreeSearchZ2;
  55.  
  56.     /* コア関連 */
  57.     p->core_info = PALET_CORE_RED | PRIORITY_ZAKO;
  58.     p->core_pt = sp_core + 1;
  59.  
  60.     p->m_work = 0;
  61.     p->m_work2 = 0;
  62.     p->m_work4 = 0;        /* 1回接近したか */
  63. }
  64.  
  65.  
  66.  
  67. /* 移動ルーチン */
  68. /* 返り値:非0なら消去 */
  69. static short EnemyMoveSearchZ2 (ENEMY * p)
  70. {
  71.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  72.     p->x = (p->lx += p->vx) >> 16;
  73.     p->y = (p->ly += p->vy) >> 16;
  74.  
  75.     switch (p->m_work) {
  76.  
  77.         /* まず突っ込んでくる */
  78.     case 0:
  79.         if (p->m_work2++ > 16) {
  80.             p->m_work++;
  81.             p->m_work2 = 0;
  82.         }
  83.         break;
  84.  
  85.         /* 減速 */
  86.     case 1:
  87.         p->vy -= 32768;
  88.         if (p->vy <= 32768) {
  89.             p->m_work++;
  90.             p->m_work2 = 0;
  91.             p->m_work3 = 0;
  92.             p->s_work = 0;
  93.         }
  94.         break;
  95.  
  96.         /* 直線運動しつつこちらを向く */
  97.     case 2:
  98.         switch (p->m_work2++) {
  99.         case 0:
  100.             if (wabs (SHORT_LX - player->x) < 16) {
  101.                 p->m_work4 = TO_CENTER;
  102.             } else {
  103.                 if (SHORT_LX < player->x)
  104.                     p->m_work4 = TO_RIGHT;    /* 右へ進む */
  105.                 else
  106.                     p->m_work4 = TO_LEFT;    /* 左へ進む */
  107.             }
  108.             break;
  109.         case 30:
  110.             p->m_work2 = 0;
  111.             break;
  112.         default:
  113.             switch (p->m_work4) {
  114.             case TO_CENTER:
  115.                 if (p->vx < 2048)
  116.                     p->vx += 2048;
  117.                 else
  118.                     p->vx -= 2048;
  119.                 if (p->vy <= 1 * 65536)
  120.                     p->vy += 2048;
  121.                 if (p->angle != 64) {
  122.                     if (p->angle > 64)
  123.                         p->angle--;
  124.                     else
  125.                         p->angle++;
  126.                 }
  127.                 p->pt = obj_searchz + ((p->angle) >> 3);
  128.                 break;
  129.             case TO_RIGHT:
  130. #define INTERVAL2    50
  131. #define SPEED_SHOT2    6
  132.                 /* 右へ進む時 */
  133.                 if (p->angle > 64 - 12)
  134.                     p->angle--;
  135.                 p->pt = obj_searchz + ((p->angle) >> 3);
  136.                 if (p->vx < 65536)
  137.                     p->vx += 4096;
  138.                 if (p->s_work++ > INTERVAL2) {
  139.                     p->s_work = 0;
  140.                     if ((wabs (player->x - p->x) + wabs (player->y - p->y)) > 96) {
  141.                         EshotAlloc (ESHOT_NRG02, p->x, p->y, SPEED_SHOT2, psearch (p->x, p->y), 0);
  142.                         SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  143.                     }
  144.                 }
  145.                 break;
  146.             case TO_LEFT:
  147.                 /* 左へ進む時 */
  148.                 if (p->angle < 64 + 12)
  149.                     p->angle++;
  150.                 p->pt = obj_searchz + ((p->angle) >> 3);
  151.                 if (p->vx > -65536)
  152.                     p->vx -= 4096;
  153.                 if (p->s_work++ > INTERVAL2) {
  154.                     p->s_work = 0;
  155.                     if ((wabs (player->x - p->x) + wabs (player->y - p->y)) > 96) {
  156.                         EshotAlloc (ESHOT_NRG02, p->x, p->y, SPEED_SHOT2, psearch (p->x, p->y), 0);
  157.                         SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  158.                     }
  159.                 }
  160.                 break;
  161.             }
  162.             break;
  163.         }
  164.         break;
  165.     default:
  166.         break;
  167.     }
  168.  
  169.     /* 画面外に出たら消去 */
  170.     if ((p->m_work > 0)
  171.         && ((SHORT_LY < -32) || (SHORT_LY > 256 + 32)
  172.         || (SHORT_LX < -32) || (SHORT_LX > 256 + 32)))
  173.         return (-1);    /* 消去 */
  174.  
  175.  
  176.     /* もし前回ダメージを受けたなら */
  177.     if (p->damage) {
  178.         p->damage = 0;
  179.         EffectAlloc (EFFECT_EXPLZAKO, 0, p->x, p->y);    /* 爆発パターンを出現させる */
  180.         EffectAlloc (EFFECT_POINTS, points_table[p->shot_count], p->x, p->y);    /* 得点を出現させる */
  181.         SoundSetSE (SE_EXPL);    /* ザコ爆発音 */
  182.         return (-1);
  183.     }
  184.     xobj_set_st (p);    /* 表示 */
  185.  
  186.     /* コアの表示 */
  187.     p->core_x = p->x - 8;
  188.     p->core_y = p->y - 8;
  189.     xsp_set_st (&(p->core_x));
  190.  
  191.     return (0);
  192. }
  193.  
  194.  
  195.  
  196. /* 消去ルーチン */
  197. static void EnemyFreeSearchZ2 (ENEMY * p)
  198. {
  199. }
  200.